package cn.mujiankeji.mbrowser.界面.小窗页.请求

import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.height
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateListOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import cn.mujiankeji.mbrowser.app.应用接口
import cn.mujiankeji.mbrowser.工具.操作.地址操作
import cn.mujiankeji.mbrowser.数据.数据库.AppDatabase
import cn.mujiankeji.mbrowser.数据.数据库.DBBookmark
import cn.mujiankeji.mbrowser.界面.框架.小窗视图.小窗状态
import cn.mujiankeji.mbrowser.界面.组件.布局.配置窗口布局
import cn.mujiankeji.mbrowser.界面.组件.配置列表.配置行
import cn.mujiankeji.mbrowser.界面.组件.配置列表.配置行_选项
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.launch
import org.koin.compose.koinInject
import 界面.弹窗.下拉菜单项目

class 添加书签窗口状态(
    名称: String,
    地址: String,
    图标: String = 地址操作.取完整主机名(地址) + "/favicon.ico", // 检测下有没有不妥
    选中文件夹Id: Long = 0, // 默认为顶级文件夹
) : 小窗状态() {

    var _名称 by mutableStateOf(名称)
    var _地址 by mutableStateOf(地址)
    var _图标 by mutableStateOf(图标)
    var _文件夹ID by mutableStateOf(选中文件夹Id)


    suspend fun 提交(db : AppDatabase){
        val bookDao = db.书签()

        val 书签 = DBBookmark(
            标题 = _名称,
            网址 = _地址,
            图标 = _图标,
            文件夹Id = _文件夹ID
        )

        // 获取同一文件夹中最大的排序值
        val 同文件夹条目 = bookDao.获取指定文件夹下的所有条目列表Suspend(_文件夹ID)
        val 最大排序值 = 同文件夹条目.maxOfOrNull { it.排序 } ?: 0

        // 将新书签设置为最后一个
        书签.排序 = 最大排序值 + 1

        // 插入书签
        bookDao.插入条目(书签)

        // 关闭窗口
        销毁小窗()
    }
    
    // 创建新文件夹
    suspend fun 创建文件夹(db: AppDatabase, 文件夹名称: String, 父文件夹ID: Long = 0) {
        val bookDao = db.书签()
        
        // 创建文件夹对象
        val 新文件夹 = DBBookmark(
            标题 = 文件夹名称,
            是否目录 = true,
            文件夹Id = 父文件夹ID
        )
        
        // 获取同一父文件夹中最大的排序值
        val 同文件夹条目 = bookDao.获取指定文件夹下的所有条目列表Suspend(父文件夹ID)
        val 最大排序值 = 同文件夹条目.maxOfOrNull { it.排序 } ?: 0
        
        // 将新文件夹设置为最后一个
        新文件夹.排序 = 最大排序值 + 1
        
        // 插入文件夹
        bookDao.插入条目(新文件夹)
    }
}

data class 文件夹项(
    val id: Long,
    val 名称: String,
    val 是否顶级: Boolean = false
)

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun 添加书签窗口实现(state: 添加书签窗口状态) {
    val db = koinInject<AppDatabase>()
    val scope = rememberCoroutineScope()
    
    // 用于存储所有可选的文件夹
    val 文件夹列表 = remember { mutableStateListOf<文件夹项>() }
    // 当前选中的文件夹名称
    var 当前文件夹名称 by remember { mutableStateOf("根目录") }
    // 是否显示创建文件夹对话框
    var 显示创建文件夹对话框 by remember { mutableStateOf(false) }
    // 新文件夹的父文件夹ID
    var 新文件夹父ID by remember { mutableStateOf(0L) }
    
    // 刷新文件夹列表
    fun 刷新文件夹列表() {
        scope.launch {
            文件夹列表.clear()
            文件夹列表.add(文件夹项(0, "根目录", true))
            
            try {
                // 获取顶级文件夹
                val 顶级文件夹 = db.书签().获取顶级文件夹().first()
                文件夹列表.addAll(顶级文件夹.map { 文件夹项(it.id, it.标题) })
                
                // 获取子文件夹
                顶级文件夹.forEach { 父文件夹 ->
                    val 子文件夹 = db.书签().获取指定文件夹下的子文件夹(父文件夹.id).first()
                    文件夹列表.addAll(子文件夹.map { 文件夹项(it.id, "${父文件夹.标题}/${it.标题}") })
                }
            } catch (e: Exception) {
                // 处理异常
            }
        }
    }
    
    // 加载所有文件夹
    LaunchedEffect(key1 = true) {
        // 添加根目录选项
        文件夹列表.add(文件夹项(0, "根目录", true))
        
        // 加载所有文件夹
        try {
            // 先获取顶级文件夹
            val 顶级文件夹 = db.书签().获取顶级文件夹().first()
            文件夹列表.addAll(顶级文件夹.map { 文件夹项(it.id, it.标题) })
            
            // 获取所有子文件夹（这里简化处理，只获取一级子文件夹）
            顶级文件夹.forEach { 父文件夹 ->
                val 子文件夹 = db.书签().获取指定文件夹下的子文件夹(父文件夹.id).first()
                文件夹列表.addAll(子文件夹.map { 文件夹项(it.id, "${父文件夹.标题}/${it.标题}") })
            }
            
            // 设置当前选中的文件夹名称
            if (state._文件夹ID != 0L) {
                val 选中文件夹 = 文件夹列表.find { it.id == state._文件夹ID }
                if (选中文件夹 != null) {
                    当前文件夹名称 = 选中文件夹.名称
                }
            }
        } catch (e: Exception) {
            // 处理可能的异常
        }
    }
    
    // 监听创建文件夹对话框
    LaunchedEffect(显示创建文件夹对话框) {
        if (显示创建文件夹对话框) {
            // 弹出输入对话框让用户输入文件夹名称
            应用接口.编辑窗口("新文件夹") { 文件夹名称 ->
                if (!文件夹名称.isNullOrBlank()) {
                    // 创建新文件夹
                    scope.launch {
                        state.创建文件夹(db, 文件夹名称, 新文件夹父ID)
                        // 刷新文件夹列表
                        刷新文件夹列表()
                    }
                }
                显示创建文件夹对话框 = false
            }
        }
    }

    配置窗口布局(
        标题 = "添加书签",
        取消 = { state.销毁小窗() },
        提交 = {
            // 处理提交操作db
            scope.launch {
                state.提交(db)
            }
        }
    ) {
        Column() {

            配置行("名称",state._名称){
                应用接口.编辑窗口(state._名称){
                    if (it != null) state._名称 = it
                }
            }

            配置行("地址",state._地址){
                应用接口.编辑窗口(state._地址){
                    if (it != null) state._地址 = it
                }
            }

            配置行("图标",state._图标){
                应用接口.编辑窗口(state._图标){
                    if (it != null) state._图标 = it
                }
            }

            配置行_选项("路径", 当前文件夹名称){ onDismiss ->
                // 实现文件夹选择下拉菜单
                文件夹列表.forEach { 文件夹 ->
                    下拉菜单项目(文件夹.名称) {
                        state._文件夹ID = 文件夹.id
                        当前文件夹名称 = 文件夹.名称
                        onDismiss()
                    }
                }
                
                // 添加分割线
                Spacer(Modifier.height(1.dp))
                
                // 添加在根目录创建新文件夹的选项
                下拉菜单项目("在根目录创建文件夹") {
                    新文件夹父ID = 0
                    显示创建文件夹对话框 = true
                    onDismiss()
                }
                
                // 如果当前选中的不是根目录，添加在当前文件夹下创建新文件夹的选项
                if (state._文件夹ID != 0L) {
                    下拉菜单项目("在当前文件夹下创建文件夹") {
                        新文件夹父ID = state._文件夹ID
                        显示创建文件夹对话框 = true
                        onDismiss()
                    }
                }
            }
        }
    }
}